package com.corpgovernment.common.enums;

import com.google.common.collect.Lists;

import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

/**
 * @author wangyujue
 */
public enum CardEnum {
    /**
     * 身份证
     */
    ID_CARD("1", "身份证"),

    /**
     * 护照
     */
    PASSPROT("2", "护照"),

    /**
     * 学生证
     */
    STUDENT_CARD("3", "学生证"),

    /**
     * 军人证
     */
    SOLDIER_CARD("4", "军人证"),

    /**
     * 回乡证
     */
    RETURN_HOME_CARD("7", "回乡证"),

    /**
     * 台胞证
     */
    TAIWAN_CARD("8", "台胞证"),

    /**
     * 港澳通行证
     */
    GANGAO_CARD("10", "港澳通行证"),

    /**
     * 国际海员证
     */
    INTERNAL_SEAFARER_CARD("11", "国际海员证"),

    /**
     * 外国人永久居留证
     */
    FOREIGNER_CARD("20", "外国人永久居留证"),

    /**
     * 旅行证
     */
    TRAVEL_CARD("21", "旅行证"),

    /**
     * 台湾通行证
     */
    TAIWAN_PASS("22", "台湾通行证"),

    /**
     * 户口簿
     */
    BOOKLET("25","户口簿"),

    /**
     * 出生证明
     */
    BIRTH_CERTIFICATE("27","出生证明"),

    /**
     * 外国人永久居留身份证
     */
    FOREIGNER_LIVE_CARD("28", "外国人永久居留身份证"),

    /**
     * 港澳台居民居住证
     */
    GANGAO_LIVE_CARD("32", "港澳台居民居住证"),

    /**
     * 其他
     */
    ELSE("99", "其他");

    /**
     * 证件名字
     */
    private String name;

    /**
     * 证件类型
     */
    private String type;

    CardEnum(String type) {
        this.type = type;
    }

    CardEnum(String type, String name) {
        this.type = type;
        this.name = name;
    }

    public static CardEnum getByType(String cardType) {
        return Arrays.stream(CardEnum.values()).filter(e -> e.getType().equals(cardType)).findFirst().orElse(null);
    }

    public static CardEnum getByName(String cardTypeName) {
        return Arrays.stream(CardEnum.values()).filter(e -> e.getName().equals(cardTypeName)).findFirst().orElse(null);
    }
    private static final Map<String, CardEnum> CardMap = new HashMap<>();

    static {
        for (CardEnum cardEnum : EnumSet.allOf(CardEnum.class)) {
            CardMap.put(cardEnum.getType(), cardEnum);
        }
    }

    public static CardEnum get(String code) {
        return CardMap.get(code);
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    /**
     * 判断证件类型是否为中国证件（详情见文档：<a href="http://conf.ctripcorp.com/pages/viewpage.action?pageId=1788732106"/>）
     * 1：身份证、4：军人证、7：回乡证、8：台胞证、10：港澳台通行证、22：台湾通行证、25：户口簿、32：港澳台居民居住证
     * 
     * @return
     */
    public static boolean verifyChineseCard(String cardType) {
        return Lists.newArrayList(ID_CARD, SOLDIER_CARD, RETURN_HOME_CARD, TAIWAN_CARD, GANGAO_CARD, TAIWAN_PASS,
            BOOKLET, GANGAO_LIVE_CARD).stream().anyMatch(item -> item.getType().equalsIgnoreCase(cardType));
    }

    public static boolean needCnNameCardType(String cardType){
        return Stream.of(ID_CARD, SOLDIER_CARD, GANGAO_CARD, TRAVEL_CARD, TAIWAN_PASS, BOOKLET, BIRTH_CERTIFICATE, FOREIGNER_LIVE_CARD, GANGAO_LIVE_CARD, ELSE).anyMatch(e -> e.getType().equals(cardType));
    }

    /**
     * 判断当前证件号是否需要转大写
     * 身份证、护照、回乡证、台胞证、外国人永久居留身份证、港澳台居民居住证 需要转大写
     * @param cardType
     * @return
     */
    public static Boolean needUpperCaseCard(String cardType){
        return Stream.of(ID_CARD, PASSPROT, RETURN_HOME_CARD, TAIWAN_CARD, FOREIGNER_LIVE_CARD, GANGAO_LIVE_CARD).anyMatch(e -> e.getType().equals(cardType));
    }
}
